<?php
/*
 * * * * * * * * * * LICENCIA * * * * * * * * * * * * * * * * * * * * *

Copyright(C) 2012
Instituto Universtiario de Tecnología Dr. Federico Rivero Palacio

Este programa es Software Libre y usted puede redistribuirlo y/o modificarlo
bajo los términos de la versión 3.0 de la Licencia Pública General (GPLv3)
publicada por la Free Software Foundation (FSF), es distribuido sin ninguna
garantía. Usted debe haber recibido una copia de la GPLv3 junto con este
programa, sino, puede encontrarlo en la página web de la FSF, 
específicamente en la dirección http://www.gnu.org/licenses/gpl-3.0.html

 * * * * * * * * * * ARCHIVO * * * * * * * * * * * * * * * * * * * * *

Nombre: InstitutoControlador.clase.php
Diseñador: Johan Alamo (johan.alamo@gmail.com)
Programador: Johan Alamo
Fecha: Julio de 2012
Descripción:  
	Este es el controlador del módulo Instituto, permite manejar las 
	operaciones relacionadas con los institutos (agregar, modificar,
	eliminar, consultar, buscar), es el intermediario entre la base de
	datos y la vista. 
	
	En el constructor se establecen las configuraciones iniciales y en 
	la función manejarRequerimiento se maneja la accion a emprender, 
	obteniéndola del arreglo Post/Get en la posición 'accion'


 * * * * * * * * Cambios/Mejoras/Correcciones/Revisiones * * * * * * * *
Diseñador - Programador /   Fecha   / Descripción del cambio
---                         ----      ---------

 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/

//Objeto Instituto
require_once "negocio/Instituto.clase.php";


//Clase que permite la comunicación con la base de datos
require_once "modulos/instituto/modelo/InstitutoServicio.clase.php";



class InstitutoControlador {
	
	
	public static function iniciar(){
		self::configurar();
		self::manejarRequerimiento();
	}
	
	private static function configurar(){
		global $gbVista;
		//permite colocar el tipo de vista que se está manejando en la 
		//petición
		if ($gbVista->obtenerFormato() == "html5")
			$gbVista->agregarJavascript("modulos/instituto/vista/html5/instituto.js");
		
	}
	
	/*Método que permite manejar el requerimiento (o acción) indicado por
	 * el usuario según su petición
	 * resumen de acciones:
	 *  listar: muestra una lista de institutos
		mostrar: muestra toda la información de un solo instituto
		preagregar: muestra el formulario para agregar un instituto
		agregar: recibe los datos de un instituto llenados en el formulario
		         llamado por 'preagregar' e intenta agregar el instituto
		         en la base de datos
		premodificar: carga en un formulario los datos de un instituto a
		              ser modificado
		modificar: envía al servidor los datos ya modificados de un 
		         instituto en intenga hacer el cambio en la base de datos
		eliminar: intenta eliminar un instituto de la base de datos
		
		Cada acción será redireccionada a un método que la procesa para 
		mayor orden 
		
	 */
	 
	 
	private static function manejarRequerimiento(){

		//permite obtener la acción a realizar en este módulo
		$accion = PostGet::obtenerPostGet('m_accion');

		//permite colocar una acción predefinida en caso de no colocarla
		if ( ! $accion)
			$accion = 'listar';
			
		if ($accion == 'mostrar') 
			self::mostrarInstituto();
		elseif ($accion == 'listar')
			self::listarInstitutos();
		elseif ($accion == 'preagregar') 
			self::preagregarInstituto();
		elseif ($accion == 'agregar') 
			self::agregarInstituto();
		elseif ($accion == 'premodificar') 
			self::premodificarInstituto();
		elseif ($accion == 'modificar') 
			self::modificarInstituto();
		elseif ($accion == 'eliminar') 
			self::eliminarInstituto();
		else
			die("Acci&oacute;n inv&aacute;lida en el m&oacute;dulo Instituto: $accion");
	}
	
	/* Médodo que permite mostar el formulario para agregar un instituto */
	private static function preagregarInstituto() {

		global $gbVista;
		
		/*le asigna la información necesaria para manejar en la vista, en
		  este caso la accion (preagregar) y un arreglo con un objeto
		  Instituto vacío
		*/
		$gbVista->asignarDato('accion',PostGet::obtenerPostGet('m_accion'));
		$gbVista->asignarDato('institutos',array(new Instituto()));
		
		/*Se asigna la dirección del archivo que mostrará la información
		  de la vista */
		//$gbVista->asignarDireccionVista("Modulos/Instituto/Vista/InstitutoAgregarModificar.php");
		
		//Muestra la vista por pantalla
		$gbVista->mostrar();
		
	}


 
	/* Método que permite agregar un instituto, recibe los parámetros desde 
	   la vista (arreglo PostGet) y llama a instituto servicio que permite
	   comunicarse con la base de datos,y este último retorna el resultado
	   ya sea éxito o fracaso, y con este resultado se le envía la respuesta
	   al usuario
	*/
	private static function agregarInstituto() {
		
		//construir el objeto instituto sin el código ya que la base de datos
		//lo asigna automáticamente 
		$instituto = new Instituto();
		$instituto->asignarNombre(PostGet::obtenerPostGet('nombre'));
		$instituto->asignarNombreCorto(PostGet::obtenerPostGet('nombreCorto'));
		$instituto->asignarDireccion(PostGet::obtenerPostGet('direccion'));

		/*llamado al servicio para agregar instituto, se le pasa como parámetro
		el objeto instituto a insertar. retorna true en caso de éxito y false
		si ocurre algún error
		*/
		$respuesta = InstitutoServicio::agregarInstituto($instituto);

		global $gbVista;
		$gbVista->asignarDato('accion',PostGet::obtenerPostGet('m_accion'));
		if ($respuesta === true) { //caso de éxito en la agregación
			//asigna como información un instituto vacío para mostrar de nuevo 
			//el formulario en blanco
			$gbVista->asignarDato('institutos',array(new Instituto()));
			//asigna el mensaje a mostrar
			$gbVista->asignarDato('mensaje','Instituto ' . $instituto->obtenerNombreCorto() . ' agregado con éxito');
		}else{  //en caso de error
			//asigna el mismo instituto como información para que permanezca
			//la información en pantalla
			$gbVista->asignarDato('institutos', array($instituto) );
			//asigna el mensaje a mostrar según el error
			$gbVista->asignarDato('mensaje','No se pudo agregar el instituto');
		}
		
		//asigna la vista que muestra la información
		//$gbVista->asignarDireccionVista("Modulos/Instituto/Vista/InstitutoAgregarModificar.php");
		//instruye a que se muestre la vista
		$gbVista->mostrar();
	}


	/*Método que permite extraer de la base de datos toda la información de 
	  un instituto. recibe los datos desde la vista (arreglo PostGet),
	  específicamente el código del instituto, lo busca en la base de datos,
	  luego construye el objeto Instituto y lo manda a la vista correspondiente
	*/
	private static function mostrarInstituto(){
		//extraer el código del instituto
		$codigo = PostGet::obtenerPostGet('codigo');

		//buscar el instituto en la base de datos, retorna false en caso
		//de error, de lo contrario retorna un arreglo con los institutos
		//en este caso un arreglo con sólo una posición
		$institutos = InstitutoServicio::obtenerInstitutoPorCodigo($codigo);
	
	
		global $gbVista;
		$gbVista->asignarDato('institutos', $institutos);

		//$gbVista->asignarDireccionVista("Modulos/Instituto/Vista/InstitutoMostrar.php");
		$gbVista->mostrar();
				
	}

	/* Permite cargar en pantalla la información de un instituto para modificarlo,
	   recibe el código del instituto, lo busca en la base de datos y luego
	   lo carga y muestra en la vista correspondiente
	*/
	private static function premodificarInstituto(){
		//obtiene el código del instituto
		$codigo = PostGet::obtenerPostGet('codigo');

		//buscar el instituto en la base de datos, retorna false en caso
		//de error, de lo contrario retorna un arreglo con los institutos
		//en este caso un arreglo con sólo una posición
		$institutos = InstitutoServicio::obtenerInstitutoPorCodigo($codigo);
	
		global $gbVista;
		//Si hubo error en la búsqueda llama a una página genérica para mostrar
		//errores
		if ($institutos === false) { //hubo error en la búsqueda
			$gbVista->asignarDato('titulo', 'Error');
			$gbVista->asignarDato('mensaje','Instituto no encontrado, no se puede hacer la modificación');
		//	$gbVista->asignarDireccionVista("Modulos/Instituto/Vista/InstitutoMensaje.php");

		// en caso de éxito carga la información en la vista correspondiente
		}else{ 
			$gbVista->asignarDato('institutos', $institutos);
			$gbVista->asignarDato('accion',PostGet::obtenerPostGet('m_accion'));
		//	$gbVista->asignarDireccionVista("Modulos/Instituto/Vista/InstitutoAgregarModificar.php");
		}
	
		//muestra la vista previamente configurada
		$gbVista->mostrar();
	}
	
	/*Permite modificar un instituto ya existente, recibe los parámetros 
	  por parte del usuario (desde la vista a través del arreglo PostGet)
	  y hace los cambios en la base de datos según la clave primaria de 
	  los institutos 
	*/
	private static function modificarInstituto() {
		
		//construir el objeto instituto proveniente desde la vista
		$instituto = new Instituto();
		$instituto->asignarCodigo(PostGet::obtenerPostGet('codigo'));
		$instituto->asignarNombre(PostGet::obtenerPostGet('nombre'));
		$instituto->asignarNombreCorto(PostGet::obtenerPostGet('nombreCorto'));
		$instituto->asignarDireccion(PostGet::obtenerPostGet('direccion'));

	
		/* llama al método encargado de realizar la modificación, retorna
		   true en caso de éxito, de lo contrario retorna false 
		*/
		$respuesta = InstitutoServicio::modificarInstituto($instituto);

		//procesar respuesta
		global $gbVista;
		$gbVista->asignarDato('accion',PostGet::obtenerPostGet('m_accion'));

		if ($respuesta === true) { //caso de exito
			$institutos = InstitutoServicio::obtenerInstitutoPorCodigo($instituto->obtenerCodigo());
			$gbVista->asignarDato('institutos',$institutos);
			$gbVista->asignarDato('mensaje','Instituto modificado con éxito');
		}else{
			$gbVista->asignarDato('institutos', array($instituto) );
			$gbVista->asignarDato('mensaje','No se pudo modificar el instituto');
		}

		//asigna la vista encargada de mostrar la data
		//$gbVista->asignarDireccionVista("Modulos/Instituto/Vista/InstitutoAgregarModificar.php");

		//muestra la vista
		$gbVista->mostrar();
	}

	
	/*Permite eliminar un instituto, recibe el código, ejecuta la acción 
	  correspondiente y muestra un mensaje con el resultado de la operación,
	  utiliza la pantalla genérica de mensajes para dar la respuesta
	*/
	private static function eliminarInstituto() {
		
		//Obtener el código del instituto a eliminar
		$codigo = PostGet::obtenerPostGet('codigo');
		
		//llamado al servicio para eliminar el instituto, retorna false
		//si ocurre algún error, o true en caso de éxito
		$respuesta = InstitutoServicio::eliminarInstituto($codigo);

		//procesar respuesta
		global $gbVista;
		$gbVista->asignarDato('titulo','Eliminar instituto');
		
		if ($respuesta == true)  //caso de exito
			$gbVista->asignarDato('mensaje','Instituto eliminado con éxito');
		else
			$gbVista->asignarDato('mensaje','Error al eliminar el instituto');
		
		//asignar la vista para mostrar mensajes, y mostrarla
		$gbVista->asignarVista("InstitutoMensaje");
		$gbVista->mostrar();
		
	}

	/*Método que permite obtener una lista de instituto según un patrón de
	  búsqueda.
	 */
	private static function listarInstitutos(){
		//obtener el patrón de búsqueda
		$patron = PostGet::obtenerPostGet('patron');
		$patron = ($patron) ? $patron : '';

		//obtener la lista de institutos según el patrón, busca coincidencias
		//con el patrón en el nombre, nombre corto y dirección
		$institutos = InstitutoServicio::obtenerListaInstitutos($patron);

		//configura y muestra la vista con los resultados.
		global $gbVista;
		$gbVista->asignarDato('institutos',$institutos);
		$gbVista->asignarDato('patron', $patron);
		$gbVista->mostrar();
	}
		
}
